package com.summerbird.mallchat.common.common.annotation;

import com.summerbird.mallchat.common.chat.service.strategy.frequency.FrequencyStrategyType;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

@Repeatable(value = FrequencyControlContainer.class)
@Retention(RetentionPolicy.RUNTIME)// 运行时生效
@Target(value = ElementType.METHOD)// 作用在方法上
public @interface FrequencyControl {

    /**
     * key的前缀，默认使用方法全限定名，除非我们需要对方法层进行频控
     * @return
     */
    String prefixKey() default "";

    /**
     * SpringEL表达式
     * @return
     */
    String spEL() default "";

    /**
     * 频控对象，默认el表达具体指定的对象
     * 对于ip和uid，来自http请求入口拦截器中的RequestHolder中
     * @return
     */
    Target target();

    /**
     * 频控时间范围，默认单位是秒
     * @return
     */
    int time();

    /**
     * 单位时间内访问最大次数
     * @return
     */
    int count();

    /**
     * 限流策略，默认是固定窗口
     * @return
     */
    FrequencyStrategyType strategyType() default FrequencyStrategyType.FIXWINDOW;

    /**
     * 时间单位，默认是秒
     * @return
     */
    TimeUnit unit() default TimeUnit.SECONDS;

    enum Target {
        UID, IP, EL
    }
}

